package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.dao.CategoriaServicioDAO;
import mx.ipn.to.CategoriaServicioTO;

public class CategoriaServicioDAOMySQL implements CategoriaServicioDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(CategoriaServicioDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO categoria_servicio (nombre,descripcion,tipo) VALUES(?,?,?)";
	private static final String DELETE = "DELETE FROM categoria_servicio WHERE id_categoria_servicio=?";
	private static final String UPDATE = "UPDATE categoria_servicio SET nombre=?,descripcion=?,tipo=? WHERE id_categoria_servicio=?";
	private static final String FINDBYID = "SELECT * FROM categoria_servicio WHERE id_categoria_servicio=?";
	private static final String FINDBYNOMTIP = "SELECT * FROM categoria_servicio WHERE nombre=? and tipo=?";
	private static final String SELECT = "SELECT * FROM categoria_servicio WHERE tipo=?";

	@Override
	public short deleteCategoriaServicio(short idCategoriaServicio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setShort(1, idCategoriaServicio);

			ps.executeUpdate();
			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return 2;
		}
	}

	@Override
	public CategoriaServicioTO findCategoriaServicioById(
			short idCategoriaServicio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idCategoriaServicio);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				idCategoriaServicio = rs.getShort("id_categoria_servicio");
				String nombre = rs.getString("nombre");
				String descripcion = rs.getString("descripcion");
				boolean tipo = rs.getBoolean("tipo");

				CategoriaServicioTO categoriaServicioTO = new CategoriaServicioTO(
						idCategoriaServicio, nombre, descripcion, tipo);
				ps.close();
				conexion.close();
				return categoriaServicioTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public CategoriaServicioTO findCategoriaServicioByNombreTipo(String nombre,
			boolean tipo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYNOMTIP);

			ps.setString(1, nombre);
			ps.setBoolean(2, tipo);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				short idCategoriaServicio = rs.getShort("id_dia_festivo");
				String descripcion = rs.getString("descripcion");

				CategoriaServicioTO categoriaServicioTO = new CategoriaServicioTO(
						idCategoriaServicio, nombre, descripcion, tipo);
				ps.close();
				conexion.close();
				return categoriaServicioTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertCategoriaServicio(
			CategoriaServicioTO categoriaServicioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, categoriaServicioTO.getNombre());
			ps.setString(2, categoriaServicioTO.getDescripcion());
			ps.setBoolean(3, categoriaServicioTO.getTipo());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<CategoriaServicioTO> selectCategoriasByTipo(boolean tipo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ps.setBoolean(1, tipo);

			ResultSet rs = ps.executeQuery();

			ArrayList<CategoriaServicioTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<CategoriaServicioTO>();

				short idCategoriaServicio = rs
						.getShort("id_categoria_servicio");
				String nombre = rs.getString("nombre");
				String descripcion = rs.getString("descripcion");

				CategoriaServicioTO categoriaServicioTO = new CategoriaServicioTO(
						idCategoriaServicio, nombre, descripcion, tipo);
				coleccion.add(categoriaServicioTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateCategoriaServicio(CategoriaServicioTO categoriaServicioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, categoriaServicioTO.getNombre());
			ps.setString(2, categoriaServicioTO.getDescripcion());
			ps.setBoolean(3, categoriaServicioTO.getTipo());
			ps.setShort(4, categoriaServicioTO.getIdCategoriaServicio());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}

}
